package com.jade.modules.workflow;

import java.util.List;

import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;

/**
 * 简单工作流的数据存储访问接口。
 */
public interface FlowDao
{
    /**
     * 新增流程处理上下文。
     *
     * @param context 流程处理上下文
     * @throws FlowException 处理异常
     */
    public void addContext(FlowContext context)
            throws FlowException;

    /**
     * 修改上下文信息。
     *
     * @param context 流程处理上下文
     * @throws FlowException 处理异常
     */
    public void updateContext(FlowContext context)
            throws FlowException;

    /**
     * 删除流程处理上下文。
     *
     * @param context 流程处理上下文
     * @throws FlowException 处理异常
     */
    public void removeContext(FlowContext context)
            throws FlowException;

    /**
     * 根据类型及相关信息获取上下文。
     *
     * @param type 流程类型
     * @param entity 业务对象
     * @return 流程上下文
     */
    public FlowContext getContext(String type, String entity);

    /**
     * 添加流程申请。
     *
     * @param apply 申请信息
     * @throws FlowException 处理异常
     */
    public void addApply(FlowApply apply)
            throws FlowException;

    /**
     * 编辑流程申请。
     *
     * @param apply 申请信息
     * @throws FlowException 处理异常
     */
    public void updateApply(FlowApply apply)
            throws FlowException;

    /**
     * 删除流程申请。
     *
     * @param apply 申请信息
     * @throws FlowException 处理异常
     */
    public void removeApply(FlowApply apply)
            throws FlowException;

    /**
     * 获取申请信息。
     *
     * @param applyId 申请标识
     * @return 申请信息。
     */
    public FlowApply getApply(long applyId);

    /**
     * 根据条件查询申请信息。
     *
     * @param type 流程类型
     * @param criteria 查询条件
     * @return 申请列表
     */
    public PagingList<FlowApply> queryApply(String type, Criteria criteria);

    /**
     * 新增流程角色设置。
     *
     * @param role 角色设置信息。
     * @throws FlowException 处理异常
     */
    public void addRole(FlowRole role)
            throws FlowException;

    /**
     * 编辑流程角色设置。
     *
     * @param role 角色设置信息。
     * @throws FlowException 处理异常
     */
    public void updateRole(FlowRole role)
            throws FlowException;

    /**
     * 删除流程角色设置。
     *
     * @param type 流程类型。
     * @param step 流程步骤，为－1时删除全部步骤的设置
     * @throws FlowException 处理异常
     */
    public void removeRole(String type, int step)
            throws FlowException;

    /**
     * 列出指定类型流程所有步骤的角色设置。
     *
     * @param type 流程类型
     * @return 各个步骤的角色设置列表
     */
    public List<FlowRole> listRole(String type);

    /**
     * 获取指定步骤的角色设置。
     *
     * @param type 流程类型
     * @param step 步骤
     * @return 角色设置
     */
    public FlowRole getRole(String type, int step);

}

